Aula 28 - Fatores

Módulo 3: Apresentando suas análises

Carolina Musso

PROFESP, DEMSP, MS

Esta semana

Aula 28 - Fatores

Variáveis categóricas ordinais com o pacote forcats

Aula 29 - Facetamento

Como apresentar vários gráficos relacionados juntos com facet_wrap e facet_grid

Aula 30 - Gráficos avançados

Extensões do ggplot , inclusão de texto e imagens, gráficos de Violino, Jitter, Rosca …

Leituras para aprofundamento

Fatores

  • Variáveis do tipo caractere mas…

    • Que têm uma ordem inata
  • Variável qualitativa/categórica ordinal

  • Possui níveis (não necessariamente alfabético).

Ordem do R

rm(list=ls()) # só para limpar o ambiente
pacman::p_load(tidyverse, rio, janitor)

linelist <- import("linelist_cleaned.rds")
linelist <- linelist %>% 
  mutate(delay_cat = case_when(
    # criteria                                   # new value if TRUE
    days_onset_hosp < 2                        ~ "< 2 dias",
    days_onset_hosp >= 2 & days_onset_hosp < 5 ~ "2-5 dias",
    days_onset_hosp >= 5                       ~ "> 5 dias")) %>% 
  filter(!is.na(delay_cat)) %>% 
  select(hospital, date_onset, days_onset_hosp, delay_cat, ct_blood)
str(linelist)
'data.frame':   5632 obs. of  5 variables:
 $ hospital       : chr  "Other" "Missing" "St. Mark's Maternity Hospital (SMMH)" "Port Hospital" ...
 $ date_onset     : Date, format: "2014-05-13" "2014-05-13" ...
 $ days_onset_hosp: num  2 1 2 2 1 1 2 1 1 2 ...
 $ delay_cat      : chr  "2-5 dias" "< 2 dias" "2-5 dias" "2-5 dias" ...
 $ ct_blood       : num  22 22 21 23 23 21 21 22 22 22 ...
ggplot(data = linelist)+
  geom_bar(  #semelhante ao geom_hist mas para categóricas
    mapping = aes(x = delay_cat))+
  theme_classic(base_size = 16)

Mudar a ordem

Para ver as categorias que tenho:

#unique(dados$nome_coluna) estrutura
unique(linelist$delay_cat)
[1] "2-5 dias" "< 2 dias" "> 5 dias"
  • Caso ela já fosse um fator:
unique(linelist_fator$delay_cat)
[1] 2-5 dias < 2 dias > 5 dias
Levels: < 2 dias > 5 dias 2-5 dias
str(linelist_fator)
'data.frame':   5632 obs. of  5 variables:
 $ hospital       : chr  "Other" "Missing" "St. Mark's Maternity Hospital (SMMH)" "Port Hospital" ...
 $ date_onset     : Date, format: "2014-05-13" "2014-05-13" ...
 $ days_onset_hosp: num  2 1 2 2 1 1 2 1 1 2 ...
 $ delay_cat      : Factor w/ 3 levels "< 2 dias","> 5 dias",..: 3 1 3 3 1 1 3 1 1 3 ...
 $ ct_blood       : num  22 22 21 23 23 21 21 22 22 22 ...
  • Pronto, agora que sei o que tem, posso reordenar.

Reordenando

linelist_fator <- linelist %>%
  mutate(delay_cat = fct_relevel(delay_cat, 
                                 "< 2 dias", 
                                 "2-5 dias","> 5 dias"))

unique(linelist_fator$delay_cat)
[1] 2-5 dias < 2 dias > 5 dias
Levels: < 2 dias 2-5 dias > 5 dias
  • As funções começam com “fct_”…

  • A variável não precisa ser fator de antemão, mas automaticamente virará.

linelist_fator <- linelist %>%
  mutate(delay_cat = factor(delay_cat, 
                            levels=c("< 2 dias", 
                                 "2-5 dias","> 5 dias")))

Como ficou

ggplot(linelist_fator )+
  geom_bar(mapping = aes(x = delay_cat))+
  theme_classic(base_size = 16)

Diretamente no gráfico

ggplot(data = linelist)+
  geom_bar(mapping = aes(x = fct_relevel(delay_cat, 
                    c("< 2 dias", 
                                 "2-5 dias","> 5 dias"))))+
  theme_classic(base_size = 16)

  • Vocês já sabem mudar os eixos!

Outras formas

  • Mudar apenas uma posição.
linelist %>% 
  mutate(delay_cat = fct_relevel(delay_cat, "< 2 dias", after = 1)) %>% 
  tabyl(delay_cat)
 delay_cat    n   percent
  > 5 dias  602 0.1068892
  < 2 dias 2990 0.5308949
  2-5 dias 2040 0.3622159
  • Novidade pra vocês: função tabyl() pacote janitor.

Pela frequência:

linelist %>% 
ggplot(aes(x = fct_infreq(delay_cat)))+
  geom_bar()+
  labs(x = "Oportunidade sintomas-internação (dias)",
       title = "Ordenado por frequência decrescente")+
  theme_classic(base_size = 16)

linelist %>% 
ggplot(data = , aes(x = fct_rev(fct_infreq(delay_cat))))+
  geom_bar()+
  labs(x = "Oportunidade sintomas-internação (dias)",
       title = "Ordenado por frequência crescente")+
  theme_classic(base_size = 16)

Pela frequência

linelist %>% 
ggplot( )+
  geom_boxplot(aes(x = delay_cat,y = ct_blood))+
  theme_classic(base_size = 16)

linelist %>% 
ggplot( )+
  geom_boxplot(
    aes(x = fct_reorder(delay_cat, ct_blood, "median"),
        y = ct_blood))+
  theme_classic(base_size = 16)

Número de níveis

linelist %>% 
  mutate(delay_cat = fct_expand(delay_cat,
                                "Não adimitido", 
                                "Transferido")) %>%
tabyl(delay_cat) #pacote janitor
     delay_cat    n   percent
      < 2 dias 2990 0.5308949
      > 5 dias  602 0.1068892
      2-5 dias 2040 0.3622159
 Não adimitido    0 0.0000000
   Transferido    0 0.0000000
linelist %>% 
  mutate(delay_cat = fct_drop(delay_cat)) %>% 
  tabyl(delay_cat)
 delay_cat    n   percent
  < 2 dias 2990 0.5308949
  > 5 dias  602 0.1068892
  2-5 dias 2040 0.3622159

Agrupar em “outros”

linelist %>% 
 mutate(hospital = fct_other(                      
    hospital,
    keep = c("Port Hospital", "Central Hospital"),  
    other_level = "Outros")) %>% 
  tabyl(hospital)    
         hospital    n    percent
 Central Hospital  436 0.07741477
    Port Hospital 1687 0.29953835
           Outros 3509 0.62304688
linelist %>% 
mutate(hospital = fct_lump(                     
    hospital,
    n = 2,                                           
    other_level = "Outros")) %>%           
  tabyl(hospital)  
      hospital    n   percent
       Missing 1398 0.2482244
 Port Hospital 1687 0.2995384
        Outros 2547 0.4522372
 linelist %>% 
  mutate(hospital = fct_lump(hospital,
    n = 2, other_level = "Outros")) %>%     
  mutate(hospital = fct_recode(
    hospital,
    "Faltante" = "Missing")) %>% 
  tabyl(hospital)
      hospital    n   percent
      Faltante 1398 0.2482244
 Port Hospital 1687 0.2995384
        Outros 2547 0.4522372

Obrigada!